use crate::error::{Result, PipitError}; 
use crate::compiler::{Token, ASTNode, Lexer, Parser}; 

/// 编译器前端：负责语法解析，生成AST
pub struct CompilerFrontend {
    lexer: Lexer,
    parser: Parser,
}

impl CompilerFrontend {
    pub fn new() -> Self {
        // 初始化一个默认的前端实例
        // 实际使用时会根据源代码更新内部状态
        let dummy_source = "";
        let lexer = Lexer::new(dummy_source);
        let parser = Parser::new(dummy_source).unwrap(); // 空源码解析会失败，但这里仅作为初始化
        
        CompilerFrontend {
            lexer,
            parser,
        }
    }
    
    /// 解析源代码，生成AST
    pub fn parse(&mut self, source: &str) -> Result<Box<ASTNode>> {
        if source.is_empty() {
            return Err(PipitError::CompileError("Cannot parse empty source".to_string()));
        }
        
        // 创建词法分析器
        self.lexer = Lexer::new(source);
        
        // 创建语法分析器
        self.parser = Parser::new(source)?;
        
        // 解析源代码，生成AST
        let ast = self.parser.parse()?;
        
        Ok(ast)
    }
    
    /// 只执行词法分析，返回Token流
    pub fn tokenize(&mut self, source: &str) -> Result<Vec<Token>> {
        if source.is_empty() {
            return Err(PipitError::CompileError("Cannot tokenize empty source".to_string()));
        }
        
        // 创建词法分析器
        self.lexer = Lexer::new(source);
        
        // 收集所有Token
        let mut tokens = Vec::new();
        loop {
            let token = self.lexer.next_token()?;
            tokens.push(token.clone());
            
            if token == Token::Eof {
                break;
            }
        }
        
        Ok(tokens)
    }
}

/// 语义分析器：对AST进行语义检查和分析
pub struct SemanticAnalyzer {
    // 可以添加类型系统、符号表等组件
}

impl SemanticAnalyzer {
    pub fn new() -> Self {
        SemanticAnalyzer {}
    }
    
    /// 对AST进行语义分析，返回分析后的AST
    pub fn analyze(&mut self, ast: Box<ASTNode>) -> Result<Box<ASTNode>> {
        // 在这里实现语义分析逻辑
        // 例如：变量声明检查、类型检查、作用域分析等
        // 目前返回原始AST
        Ok(ast)
    }
}